# -*- coding: utf-8 -*-
'''
Created on Mar 22, 2011

@author: kivson
'''
import mwclient
from lex import Token, Parser
from modelo import CitacaoLimpa
class PAS(object):
    '''
    Pseudo Analisador Sintatico.
    Utiliza o objeto Pagina do mwcliente e a lista de tokens
    gerapa pela analise da do conteudo da pagina para gerar
    os pares de citação-autor.
    '''


    def __init__(self, pagina, log = None):
        '''
        Constructor
        '''
        self.pagina = pagina
        self.PagTags = []
        self.parser = Parser(pagina.edit())
        self.tokens = None
        self.citacoes = []
        self.log = log


    def _parseia(self):
        self.parser.run()
        self.tokens = self.parser.tokens
        self.setTags()

    def setTags(self):
        for categoria in self.pagina.categories():
            self.PagTags.append(categoria.name)
        self.PagTags.append(self.pagina.name)

    def setaTagsDeTodasAscitacoes(self):
        for citacao in self.citacoes:
            for tag in self.PagTags:
                citacao.addTags(tag)

    def analisa(self):
        self._parseia()
        if not self.tokens:
            return
        self.possueAutorGlobal()
        if self.AutorGlobal:
            while self.tokens:
                token = self.tokens.pop(0)
                if token.tipo == Token.CITACAO:
                    self.addCitacao(token.getValorUnicode(), self.AutorGlobal.getValorUnicode())
        else:
            tituloAtual = None
            while self.tokens:
                token = self.tokens.pop(0)
                if token.tipo == Token.TITULO:
                    tituloAtual = token.getValorUnicode()
                elif token.tipo == Token.CITACAO:
                    citacao = token.getValorUnicode()
                    #trata a citação que faz parte de um dialogo, ignora!!!!
                    if citacao.startswith("'''"):
                        continue
                    if self.tokens:
                        possivelAutor = self.tokens.pop(0)
                        if possivelAutor.tipo == Token.AUTOR:
                            self.addCitacao(citacao, possivelAutor.getValorUnicode())
                        else:
                            self.tokens.insert(0,possivelAutor)
                            if tituloAtual:
                                self.addCitacao(citacao, tituloAtual)
                            else:
                                self.addCitacao(citacao, None)
                    else:
                        self.addCitacao(citacao, None)

        self.setaTagsDeTodasAscitacoes()


    def addCitacao(self, conteudo, autor):
        citacao = CitacaoLimpa(conteudo, autor)
        if self.log :
            self.log.info(str(citacao))
        self.citacoes.append(citacao)


    def possueAutorGlobal(self):

        self.AutorGlobal = False
        if self.tokens[0].tipo == Token.AUTOR_GLOBAL:
            self.AutorGlobal = self.tokens[0]




def iniciaLog():
    import logging
    logging.basicConfig(filename = "../../logs/parser.log", level = logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    return logging.getLogger("utilidades.sint")

def testee():
    site = mwclient.Site('pt.wikiquote.org')

    for page in site.allpages( prefix = 'A'):
        print page.name
        s = PAS(page, iniciaLog())
        s.analisa()
        for citacao in s.citacoes:
            print citacao



if __name__ == "__main__":
    import cProfile
    testee()
    #cProfile.run('testee()')